package com.zmz.juc.readwrite;

import java.util.concurrent.locks.ReentrantReadWriteLock;

//演示读写锁降级  获取读锁后不能再获取写锁，否则会阻塞
//可重入读写锁是一种特殊的锁，它允许同一个线程多次获取同一类型的锁，而不会引发死锁。

/**
 o 可重入读写锁允许在某个线程已经持有写锁的情况下，再次获取读锁。这是因为写锁是排他的，只能被一个线程持有，所以允许一个线程在写操作期间继续读操作是安全的。

 o 然而，反过来是不安全的：如果一个线程已经持有读锁，然后尝试获取写锁，这可能导致问题。因为读锁是共享的，多个线程可以同时持有读锁，但写锁是排他的，
 只能被一个线程持有。如果一个线程持有读锁，其他线程也可以持有读锁，这时候一个线程要获取写锁，它需要等待所有的读锁都被释放，但这可能永远不会发生，
 因为其他线程可以一直持有读锁。这样可能导致写锁永远无法获取，而造成死锁或数据一致性问题。
 */
public class Demo1 {

    public static void main(String[] args) {
        //可重入读写锁对象
        ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
        ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();//读锁
        ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();//写锁

//        writeLock.lock();
//        System.out.println("atguigu");
//
//        writeLock.lock();
//        System.out.println("atguigu");

        //锁降级
        //2 获取读锁
        readLock.lock();
        System.out.println("---read");
//        readLock.unlock();

        //1 获取写锁
        writeLock.lock();
        System.out.println("atguigu");

        //3 释放写锁
        //writeLock.unlock();

        //4 释放读锁
        //readLock.unlock();
    }
}
